package com.zhss.eshop.inventory.command.factory;

import com.zhss.eshop.common.constant.CollectionSize;
import com.zhss.eshop.common.util.DateProvider;
import com.zhss.eshop.inventory.command.PurchaseInputStockUpdater;
import com.zhss.eshop.inventory.command.StockUpdater;
import com.zhss.eshop.inventory.domain.model.InventoryGoodsStock;
import com.zhss.eshop.inventory.mapper.InventoryGoodsStockMapper;
import com.zhss.eshop.wms.domain.dto.WmsPurchaseInputOrderDTO;
import com.zhss.eshop.wms.domain.dto.WmsPurchaseInputOrderItemDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 采购入库库存更新命令的工厂
 *
 * @author suyuan
 */
@Component
public class PurchaseInputStockUpdaterFactory<T>
        extends AbstractStockUpdaterFactory<T> {

    /**
     * 构造函数注入
     *
     * @param goodsStockDAO 商品库存管理模块的DAO组件
     * @param dateProvider  日期辅助组件
     */
    @Autowired
    public PurchaseInputStockUpdaterFactory(
            InventoryGoodsStockMapper goodsStockDAO,
            DateProvider dateProvider) {
        super(goodsStockDAO, dateProvider);
    }

    /**
     * 获取商品sku id集合
     *
     * @return 商品sku id集合
     * @throws Exception
     */
    @Override
    protected List<Long> getGoodsSkuIds(T parameter) throws Exception {
        WmsPurchaseInputOrderDTO purchaseInputOrderDTO = (WmsPurchaseInputOrderDTO) parameter;
        List<WmsPurchaseInputOrderItemDTO> purchaseInputOrderItemDTOs = purchaseInputOrderDTO.getItems();

        if (purchaseInputOrderItemDTOs == null || purchaseInputOrderItemDTOs.size() == 0) {
            return new ArrayList<Long>();
        }

        List<Long> goodsSkuIds = new ArrayList<Long>(purchaseInputOrderItemDTOs.size());

        for (WmsPurchaseInputOrderItemDTO purchaseInputOrderItemDTO : purchaseInputOrderItemDTOs) {
            goodsSkuIds.add(purchaseInputOrderItemDTO.getGoodsSkuId());
        }

        return goodsSkuIds;
    }

    /**
     * 创建库存更新命令
     *
     * @param goodsStockDOs 商品库存DO对象集合
     * @return 库存更新命令
     * @throws Exception
     */
    @Override
    protected StockUpdater create(
            List<InventoryGoodsStock> goodsStockDOs,
            T parameter) throws Exception {
        WmsPurchaseInputOrderDTO purchaseInputOrderDTO = (WmsPurchaseInputOrderDTO) parameter;
        List<WmsPurchaseInputOrderItemDTO> purchaseInputOrderItemDTOs = purchaseInputOrderDTO.getItems();

        Map<Long, WmsPurchaseInputOrderItemDTO> purchaseInputOrderItemDTOMap = new HashMap<Long, WmsPurchaseInputOrderItemDTO>(CollectionSize.DEFAULT);

        if (purchaseInputOrderItemDTOs != null && purchaseInputOrderItemDTOs.size() > 0) {
            for (WmsPurchaseInputOrderItemDTO purchaseInputOrderItemDTO : purchaseInputOrderItemDTOs) {
                purchaseInputOrderItemDTOMap.put(purchaseInputOrderItemDTO.getGoodsSkuId(),
                        purchaseInputOrderItemDTO);
            }
        }

        //创建库存更新命令
        return new PurchaseInputStockUpdater(goodsStockDOs, goodsStockDAO,
                dateProvider, purchaseInputOrderItemDTOMap);
    }

}
